package com.itheima.leetcode.od.b.violentenumeration;

import java.util.*;
import java.util.stream.Collectors;

/**
 * (A卷,100分)- 猜字谜（Java & JS & Python）
 * <p>
 * 题目描述
 * <p>
 * 小王设计了一个简单的猜字谜游戏，游戏的谜面是一个错误的单词，比如nesw，玩家需要猜出谜底库中正确的单词。猜中的要求如下：
 * 对于某个谜面和谜底单词，满足下面任一条件都表示猜中：
 * <p>
 * 变换顺序以后一样的，比如通过变换w和e的顺序，“nwes”跟“news”是可以完全对应的；
 * 字母去重以后是一样的，比如“woood”和“wood”是一样的，它们去重后都是“wod”
 * 请你写一个程序帮忙在谜底库中找到正确的谜底。谜面是多个单词，都需要找到对应的谜底，如果找不到的话，返回”not found”
 * <p>
 * 输入描述
 * <p>
 * 谜面单词列表，以“,”分隔
 * <p>
 * 谜底库单词列表，以","分隔
 * <p>
 * 输出描述
 * <p>
 * 匹配到的正确单词列表，以","分隔
 * <p>
 * 如果找不到，返回"not found"
 * <p>
 * 备注
 * <p>
 * 单词的数量N的范围：0 < N < 1000
 * <p>
 * 词汇表的数量M的范围：0 < M < 1000
 * <p>
 * 单词的长度P的范围：0 < P < 20
 * <p>
 * 输入的字符只有小写英文字母，没有其他字符
 * <p>
 * 用例
 * <p>
 * 输入	conection
 * <p>
 * connection,today
 * <p>
 * 输出	connection
 * 说明	无
 * <p>
 * 输入	bdni,wooood
 * <p>
 * bind,wrong,wood
 * <p>
 * 输出	bind,wood
 * <p>
 * 说明	无
 */
public class FindNumOfValidWords {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);

        String[] issues = sc.nextLine().split(",");
        String[] answers = sc.nextLine().split(",");*/

        String[] issues = "conection".split(",");
        String[] answers = "connection,today".split(",");
        System.out.println(getResult(issues, answers));
        System.out.println(getResult2(issues, answers));
    }

    public static String getResult(String[] issues, String[] answers) {
        ArrayList<String> ans = new ArrayList<>();

        for (String issue : issues) {
            String str1 = getSortedAndDistinctStr(issue);
            boolean find = false;

            for (String answer : answers) {
                String str2 = getSortedAndDistinctStr(answer);
                if (str1.equals(str2)) {
                    ans.add(answer);
                    find = true;
                    // break; // 如果一个谜面对应多个谜底，这里就不能break，如果一个谜面只对应一个谜底，那这里就要break，考试的时候都试下
                }
            }

            if (!find) {
                ans.add("not found");
            }
        }

        return ans.stream().collect(Collectors.joining(","));
    }

    public static String getSortedAndDistinctStr(String str) {
        TreeSet<Character> set = new TreeSet<>();
        for (char c : str.toCharArray()) {
            set.add(c);
        }
        return set.toString();
    }

    public static String getResult2(String[] issues, String[] answers) {
        ArrayList<String> ans = new ArrayList<>();

        for (String issue : issues) {
            String[] issueDeal = getSortedAndDistinctStr2(issue);
            boolean find = false;

            for (String answer : answers) {
                String[] answerDeal = getSortedAndDistinctStr2(answer);

                if (issueDeal[0].equals(answerDeal[0]) || issueDeal[1].equals(answerDeal[1])) {
                    ans.add(answer);
                    find = true;
                    // break; // 如果一个谜面对应多个谜底，这里就不能break，如果一个谜面只对应一个谜底，那这里就要break，考试的时候都试下
                }
            }

            if (!find) {
                ans.add("not found");
            }
        }

        return ans.stream().collect(Collectors.joining(","));
    }

    public static String[] getSortedAndDistinctStr2(String str) {
        char[] arr = str.toCharArray();
        Arrays.sort(arr);
        String sorted_str = new String(arr); // 字典序排序后的字符串

        LinkedHashSet<Character> set = new LinkedHashSet<>();
        for (char c : str.toCharArray()) {
            set.add(c);
        }
        String distinct_str = set.toString(); // 去重后的字符串

        return new String[]{sorted_str, distinct_str};
    }
}